package com.atts.baccarat.table.impl;

import java.util.List;

import com.atts.baccarat.table.BaccaratTable;
import com.atts.baccarat.table.Table;
import com.atts.baccarat.table.TableItem;

/**
 * 颜色交替表格， 例如大路，当颜色变化时，另起一列
 * 
 * @author Administrator
 * 
 */
public abstract class XORColorTable extends Table implements BaccaratTable {

	/**
	 * 当前操作的列
	 */
	private int currentColumnIndex = 0;

	/**
	 * 当前操作的行
	 */
	private int currentRowIndex = 0;

	public XORColorTable(final int rowCount) {
		super(rowCount);
	}

	@Override
	public void add(final TableItem item) {

		if (item != null && !this.isValidItem(item)) {
			throw new IllegalArgumentException(
			"TableItem is invalid for this table");
		}

		// 当前列第一个元素。用于比较颜色
		final TableItem columnHead = super.getItem(0, this.currentColumnIndex);
		if (columnHead == null || columnHead.getColor() == item.getColor()) {

			// 当前列还没有元素。 或颜色相同
			super.addItem(this.currentRowIndex, this.currentColumnIndex, item);

			this.currentRowIndex++;

		} else {

			// 颜色不同，另起一列
			this.currentRowIndex = 0;
			this.currentColumnIndex++;

			super.addItem(this.currentRowIndex, this.currentColumnIndex, item);

			this.currentRowIndex++;
		}

	}

	/**
	 * 清空数据
	 */
	@Override
	public void clear() {

		super.clear();
		this.currentColumnIndex = 0;
		this.currentRowIndex = 0;
	}

	@Override
	public void previous() {

		if (this.currentColumnIndex == 0 && this.currentRowIndex == 0) {
			return;
		}

		if (this.currentRowIndex == 1) {

			// 回到上一列

			// 清空当前列
			super.addItem(0, this.currentColumnIndex, null);

			// 回到上一列
			if (this.currentColumnIndex > 0) {
				this.currentColumnIndex--;
			}

			// 回到上一列的最后一个元素
			final List<TableItem> lastColumn = super.getMatrix().get(
					this.currentColumnIndex);

			int notNullCount = 0;
			for (final TableItem item : lastColumn) {
				if (item != null) {
					notNullCount++;
				}
			}

			this.currentRowIndex = notNullCount;

		} else {
			// 当前列回退一个元素
			super.addItem(this.currentRowIndex - 1, this.currentColumnIndex,
					null);

			this.currentRowIndex--;
		}
	}

	@Override
	public TableItem getLast() {

		if (this.currentColumnIndex == 0 && this.currentRowIndex == 0) {
			return null;
		}

		// 当前列回退一个元素
		return super.getItem(this.currentRowIndex - 1, this.currentColumnIndex);
	}

	@Override
	public List<List<TableItem>> getMatrixForDisplay() {

		final Table copy = new Table(super.getRowCount());

		for (int i = 0; i < super.getMatrix().size(); i++) {

			final List<TableItem> column = super.getMatrix().get(i);

			// 折行位置
			int breakRowIndex = -1;
			for (int j = 0; j < column.size(); j++) {

				final TableItem item = column.get(j);

				// 将要存放元素的位置
				final TableItem copyCell = copy.getItem(j, i);

				if (copyCell != null || j >= super.getRowCount()) {
					// 横向折行
					if (breakRowIndex == -1) {
						breakRowIndex = j - 1;
					}
					final int c = i + (j - breakRowIndex);

					copy.addItem(breakRowIndex, c, item);
				} else {
					// 直接放置
					copy.addItem(j, i, item);
				}
			}
		}

		return copy.getMatrix();
	}

	public int getCurrentColumnIndex() {
		return this.currentColumnIndex;

	}

	public int getCurrentRowIndex() {
		return this.currentRowIndex;
	}

}
